#pragma once
#include <iostream>
#include <boost/asio.hpp>
using boost::asio::ip::tcp;

// Session类：处理单个TCP连接的会话
class Session
{
public:
	// 构造函数：接收io_context引用来创建socket
	Session(boost::asio::io_context &ioc) : _socket(ioc)
	{
	}
	// 获取socket的引用
	tcp::socket &Socket()
	{
		return _socket;
	}

	// 开始处理会话
	void Start();

private:
	// 处理异步读取操作的回调函数
	void handle_read(const boost::system::error_code &error, size_t bytes_transfered);
	// 处理异步写入操作的回调函数
	void handle_write(const boost::system::error_code &error);
	// TCP socket对象
	tcp::socket _socket;
	// 定义最大数据缓冲区长度
	enum
	{
		max_length = 1024
	};
	// 数据缓冲区
	char _data[max_length];
};

// Server类：管理TCP服务器，接受新的连接
class Server
{
public:
	// 构造函数：初始化服务器，设置监听端口
	Server(boost::asio::io_context &ioc, short port);

private:
	// 开始接受新的连接
	void start_accept();
	// 处理新连接接受完成后的回调函数
	void handle_accept(Session *new_session, const boost::system::error_code &error);
	// io_context的引用，用于异步操作
	boost::asio::io_context &_ioc;
	// 接受器对象，用于监听新连接
	tcp::acceptor _acceptor;
};
